/*******************************************************************************************
 *      @name   tcp_client.c
 *      @brief  这是在linux系统下的使用TCP套接字实现TCP通信(客户端)的代码案例，主要学习TCP协议
 *      @date   2025/02/21
 *      @author cecelmx@126.com 
 *      @note
 *              1.想要使用TCP套接字通信的前提是调用socket函数创建TCP套接字
 *                tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
 * 
 *            
 * 
 *      @version  xx.xx.xx   主版本号.次版本号.修正版本号
 * 
 *      CopyRight (c)   2024-2025   Your Name     All Right Reserved
 * 
 * ****************************************************************************************/

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>



//目标主机的端口和IP地址通过命令行传递   格式： ./xxx -- argv[0]  目标IP -- argv[1] 目标端口 -- argv[2]
int main(int argc,char **argv)
{

    //0.检查参数有效性
    if(3 != argc)
    {
        fprintf(stderr,"argument invaild,%s\n",strerror(errno));
        exit(-1);
    }

    //1.创建TCP套接字
    int tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 
    if(-1 == tcp_socket)
    {
        fprintf(stderr,"create tcp socket error,%s\n",strerror(errno));
        exit(-1);
    }
    
    //2.向服务器发起连接请求
    struct sockaddr_in dest ={0};                 //IPv4地址格式的实例
    dest.sin_family = AF_INET;                    //IPv4协议族
    dest.sin_port   = htons(atoi(argv[2]));       //目标端口，需要转换为网络字节序
    dest.sin_addr.s_addr = inet_addr(argv[1]);    //目标地址，需要转换为网络字节序

    if(-1 == connect(tcp_socket,(struct sockaddr *)&dest,sizeof(dest)))
    {
        fprintf(stderr,"connect error,%s\n",strerror(errno));
        exit(-2);
    }

    printf("connect ok\n");

    //3.可以和服务器进行通信 send()/recv()  or  write()/read()  or  sendto()/recvfrom()
    char sendbuf[1024] ={0};
    for(;;)
    {
        printf("请输入数据：");
        scanf("%s",sendbuf);

        write(tcp_socket,sendbuf,strlen(sendbuf));
    }
    return 0;
}

